go语言提升(三):select、死锁、互斥锁、读写锁、条件变量、生产者消费者模型

您所在的位置:网站首页 go 语言 deadlock go语言提升(三):select、死锁、互斥锁、读写锁、条件变量、生产者消费者模型

go语言提升(三):select、死锁、互斥锁、读写锁、条件变量、生产者消费者模型

2024-06-03 06:08| 来源: 网络整理| 查看: 265

go语言提升(三):select、死锁、互斥锁、读写锁、条件变量、生产者消费者模型 1. select 1.1 select 概述

select是一个关键字。

select用于监听数据在channel上的流动

select监听channel是异步机制。

语法:

select { case for { select { case num := for { select { case num := ch for { select { case num := // 加锁 mutex.Lock() for _, ch := range str { fmt.Printf("%c", ch) time.Sleep(time.Millisecond * 300) } // 解锁 mutex.Unlock() } func user1() { printer("hello") } func user2() { printer("world") } func main() { go user1() go user2() for { ; } } 3.2 读写锁

特性

读操作可以同时共享访问,写操作要互斥访问。写锁优先级高(读锁和写锁同时要加锁时,写锁先加)注意:不会抢占

锁只有一把,有两种属性(r/w)

定义以及使用

// 创建读写锁对象 var rwMutex RWMutex // 写锁 func (rw *RWMutex) Lock() func (rw *RWMutex) Unlock() // 读锁 func (rw *RWMutex) RLock() func (rw *RWMutex) RUnlock() var count int var rwLock sync.RWMutex func readGo(index int) { for { rwLock.RLock() fmt.Printf("----%d----读:%d\n", index, count) rwLock.RUnlock() time.Sleep(time.Millisecond * 300) } } func writeGo(index int) { for { num := rand.Intn(500) rwLock.Lock() count = num fmt.Printf("----%d----写:%d\n", index, count) rwLock.Unlock() time.Sleep(time.Millisecond * 400) } } func main() { rand.Seed(time.Now().UnixNano()) for i := 0; i go writeGo(i + 1) } for { runtime.GC() // 防止被编译器优化掉空循环 } } 4. 条件变量

条件变量要和锁一起使用

type Cond struct { // 在观测或更改条件时L会冻结 L Locker // 包含隐藏或非导出字段 }

wait方法

func (c *Cond) Wait()

阻塞等待条件变量满足

释放已经掌握的互斥锁,相当于cond.L.Unlock(),这两步是一个原子操作

当被唤醒时,Wait()函数解除阻塞,并重新获得互斥锁。相当于cond.L.Lock()

用于唤醒的两个方法

func (c *Cond) Signal() func (c *Cond) Broadcast() 条件变量与生产者消费者模型

在这里插入图片描述

var cond sync.Cond func consumer(out cond.L.Lock() for len(out) == 0 { cond.Wait() } num := cond.L.Lock() for len(in) == cap(in) { cond.Wait() } num := rand.Intn(100) in go consumer(ch, i+1) } for i := 0; i runtime.GC() } } 注意在使用条件变量的地方要使用循环。因为线程中Wait方法是第一个恢复执行的,而此时c.L未加锁。调用者不应假设Wait恢复时条件已满足,相反,调用者应在循环中等待。Signal唤醒等待c的一个线程(如果存在)。调用者在调用本方法时,建议(但并非必须)保持c.L的锁定。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3